package java6681.register;

import javafx.beans.InvalidationListener;
import javafx.beans.Observable;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.event.Event;
import javafx.event.EventHandler;
import javafx.fxml.FXML;
import javafx.scene.control.*;

import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * @author Junichiro
 * @description
 * @date 2021-04-11 13:48
 **/

public class Register6681Controller {

    @FXML
    private TextField tfName;

    @FXML
    private PasswordField pf1;

    @FXML
    private PasswordField pf2;

    @FXML
    private TextField tfPhone;

    @FXML
    private Label lblName;

    @FXML
    private Label lblPW1;

    @FXML
    private Label lblPW2;

    @FXML
    private Label lblPhone;

    @FXML
    private Button btnCancel;

    @FXML
    private Button btnOk;

    @FXML
    private ListView<User6681> lvUsers;

//    private static ArrayList<User6681> array = new ArrayList<User6681>();

    @FXML
    private void initialize() {
        /*为了提高代码的通用性，为四个输入控件设置一组自定义的属性*/
        setUserProperties();
        /*为了提高代码的通用性，为四个输入控件的焦点变更事件指定同一个监听对象*/
        /*在得到和失去焦点时，检查当前输入框中输入的内容是否正确*/
        ChangeListener<Boolean> listener = new ChangeListener<Boolean>() {
            @Override
            public void changed(ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean newValue) {
                /*用反射技术从事件参数ObservableValue中读取与之关联的控件TextField*/
                /*即获取当前焦点所在的TextField控件*/
                try {
                    /*this$0是编译时自动添加的字段名，特指该匿名内部类所在的外部类的引用*/
                    /*获取该字段*/
                    Field outerClass = observable.getClass().getDeclaredField("this$0");
                    /*this$0是私有的，提升访问权限*/
                    outerClass.setAccessible(true);
                    /*得到该字段上的值，即当前焦点所在的TextField*/
                    Object fieldValue = outerClass.get(observable);
                    /*检查当前焦点所在TextField中的输入内容是否符合要求*/
                    checkInput((TextField) fieldValue);
                } catch (NoSuchFieldException | IllegalAccessException e) {
                    e.printStackTrace();
                }
            }
        };
        tfPhone.focusedProperty().addListener(listener);
        tfName.focusedProperty().addListener(listener);
        pf1.focusedProperty().addListener(listener);
        pf2.focusedProperty().addListener(listener);
    }

    private void setUserProperties() {
        /*利用getProperties()返回值Map，为每个TextField设置一组自定义的属性*/
        /*(1)key = err,表示显示错误信息的Label控件*/
        tfName.getProperties().put("err", lblName);
        tfPhone.getProperties().put("err", lblPhone);
        pf1.getProperties().put("err", lblPW1);
        pf2.getProperties().put("err", lblPW2);

        /*(2)key = next,表示下一个得到焦点的控件*/
        tfName.getProperties().put("next", pf1);
        tfPhone.getProperties().put("next", btnOk);
        pf1.getProperties().put("next", pf2);
        pf2.getProperties().put("next", tfPhone);

        /*(3)key = regex ，表示检查输入内容的正则表达式*/
        tfPhone.getProperties().put("regex", "1[3578]\\d{9}");
        pf1.getProperties().put("regex", "(?=.*[a-z])(?=.*[A-Z])(?=.*\\d).{6,}");
    }

    @FXML
    void enterKey(ActionEvent event) {
        /*在文本框Enter键的处理方法*/
        /*四个文本框使用相同的处理方法*/
        TextField source = (TextField) event.getSource();
        if (checkInput(source)) {
            /*检查通过，焦点移到下一个控件*/
            ((Control) source.getProperties().get("next")).requestFocus();
        }
    }

    private boolean checkInput(TextField source) {
        String input = source.getText().trim();
        boolean isOk = false;
        if (input.isEmpty()) {

        } else if (source == tfName) {
            /*判断用户名是否唯一*/
            isOk = checkName(input);
        } else if (source == pf2) {
            /*判断两次密码是否相同*/
            isOk = input.equals(pf1.getText());
        } else {
            /*判断输入的内容是否符合正则表达式*/
            String regex = (String) source.getProperties().get("regex");
            isOk = input.matches(regex);
        }
        ((Label) source.getProperties().get("err")).setVisible(!isOk);
        return isOk;
    }

    private boolean checkName(String input) {
        /*在集合中遍历,判断用户名是否存在*/
        for (User6681 user : lvUsers.getItems()) {
            if (user.getUsername().equalsIgnoreCase(input)) {
                return false;
            }
        }
        return true;
    }

    @FXML
    void okClick(ActionEvent event) {
        /*全面检查:逐项检查*/
        boolean okName = checkInput(tfName);
        boolean okPW1 = checkInput(pf1);
        boolean okPW2 = checkInput(pf2);
        boolean okPhone = checkInput(tfPhone);
        if (okName && okPW1 && okPW2 && okPhone) {
            User6681 user = new User6681(tfName.getText(), pf1.getText(), tfPhone.getText());
            lvUsers.getItems().addAll(user);
            Alert alert = new Alert(Alert.AlertType.INFORMATION);
            alert.setTitle("用户注册");
            alert.setHeaderText("注册成功");
            alert.show();
        }

    }

    public void noClick(ActionEvent event) {
    }

//    @FXML
//    void noClick() {
//        lblPW1.setVisible(false);
//        lblPW2.setVisible(false);
//        lblPhone.setVisible(false);
//    }
//
//    /*Zhang1024*/
//    @FXML
//    void okClick() {
//        String pwdRules = "(?=.*[a-z])(?=.*[A-Z])(?=.*\\d).{6,}";
//        String pwd1 = pf1.getText();
//        String pwd2 = pf2.getText();
//        String phone = phone(tfPhone.getText());
//        /*判断*/
//        boolean flag = pwd1.matches(pwdRules);
//        /*打印*/
//        Pattern pattern = Pattern.compile(pwdRules);
//        Matcher ma = pattern.matcher(pf1.getText());
//
//        ObservableList<String> items = lvUsers.getItems();
//        /*判断密码是否符合规则 符合输出 否则提示*/
//        if (!(pwd1.trim().isEmpty() && pwd2.trim().isEmpty())) {
//            if (pwd1.equals(pwd2)) {
//                if (flag) {
//                    while (ma.find()) {
//                        User6681 user = new User6681();
//                        user.setUsername(tfName.getText());
//                        user.setPassword(ma.group());
//                        user.setPhone(phone);
//                        register(user);
//                        items.addAll(user.toString());
//                        lblPW1.setVisible(false);
//                        lblPW2.setVisible(false);
//                        lblPhone.setVisible(false);
//                    }
//                } else {
//                    lblPW1.setVisible(true);
//                }
//            } else {
//                lblPW2.setVisible(true);
//            }
//        }
//        phone(tfPhone.getText());
//    }
//
//    public String phone(String phone) {
//        String phoneRules = "1[3578]\\d{9}";
//        boolean flag = phone.matches(phoneRules);
//        Pattern pattern = Pattern.compile(phoneRules);
//        Matcher ma = pattern.matcher(phone);
//        if (flag) {
//            while (ma.find()) {
//                return ma.group();
//            }
//        } else {
//            lblPhone.setVisible(true);
//        }
//        return null;
//    }
//
//    public void register(User6681 user) {
//        // 把用户信息存储集合
//        array.add(user);
//    }
}

